package algo_lignes_sites.params;

import commons.data.Zone;
import commons.data.category.Category;
import algo_lignes_sites.params.objects.contraintesgeom.ContrainteGeomLine;
import algo_lignes_sites.params.objects.contraintesgeom.ContrainteGeomNode;
import commons.io.in.File_in;
import commons.params.A_Params;
import commons.data.EchelleGeneralization;
import commons.params.objects.ObjectColor;
import java.util.ArrayList;

/**
 * Objet créé par le ParamsManager à la fin de l'edition des paramètres par l'utilisateur.
 * Il regroupe l'ensemble des paramètres en types de base.
 */
public class Params_ls extends A_Params {

	public Params_ls() {

		vChampFusionLine = new ArrayList<String>();
		vCategoryLine = new ArrayList<Category>();
		vCategoryNode = new ArrayList<Category>();
		vZone = new ArrayList<Zone>();
		vEchelleGeneralization_path = new ArrayList<EchelleGeneralization>();
		vEchelleGeneralization_node = new ArrayList<EchelleGeneralization>();
		vContrainteGeomLine = new ArrayList<ContrainteGeomLine>();
		vContrainteGeomNode = new ArrayList<ContrainteGeomNode>();
		vColorLine = new ArrayList<ObjectColor>();
		vColorNode = new ArrayList<ObjectColor>();
	}

	// Nom du fichier de paramètre utilisé -> utilisé pour proposer un nom de traitement pour la sauvegarde
	//  et pour le titre de la fenêtre principale
	public String nomParam;
	@Override
	public String getParamName() {
		return nomParam;
	}

	// Nom des couches de ligne et de nodes a generaliser
	public String nomCoucheLine;
	public String nomCoucheNode;
	public File_in coucheLine;
	public File_in coucheNode;

	// Liste des champs de fusion pour les lignes
	public ArrayList<String> vChampFusionLine;

	//Catégories de Line et Node
	public ArrayList<Category> vCategoryLine;
	public ArrayList<Category> vCategoryNode;

	// Filtre principal
	public Category mainFilterLine;
	public Category mainFilterNode;

	// Zones particulières
	public ArrayList<Zone> vZone;

	// Paramètres de généralisation
	//  Echelles de généralisation (= echelle pour une zone données et pour des catégories données)
	public double echelleCible;
	public ArrayList<EchelleGeneralization> vEchelleGeneralization_path;
	public ArrayList<EchelleGeneralization> vEchelleGeneralization_node;
	// Le Param Manager aura pris soin de stocker en 1ere position une regle par defaut qui
	//  s'applique à tous les objets de toutes les zones de sorte que, nécessairement
	//  lors de l'affectation des regles, tous les objets aient au moins une règle par defaut
	public EchelleGeneralization getDefautEchelleGeneralization_path() {return vEchelleGeneralization_path.get(0);}
	public EchelleGeneralization getDefautEchelleGeneralization_node() {return vEchelleGeneralization_node.get(0);}

	// Contraintes geometriques Line et Node
	public ArrayList<ContrainteGeomLine>  vContrainteGeomLine;
	public ArrayList<ContrainteGeomNode>  vContrainteGeomNode;

	public double influenceIntersection;


	// Paramètres d'affichage
	public ArrayList<ObjectColor> vColorLine;
	public ArrayList<ObjectColor> vColorNode;

	public String champLibelleLine;
	public String champLibelleNode;
	public String champTriLine;
	public String champTriNode;
	public boolean bBiggestOnTopLine;
	public boolean bBiggestOnTopNode;

	public boolean bShowBarbules;
	public double factor_EpaisseurBarbules;
	public double factor_InterBarbules;

	
	//*********** Paramètes avancés ******************************

	// PRE-TRAITEMENT
	
	
	// Snap des nodes isolés sur les lignes
	public double toleranceSnapNode;


	//  Simplification dans nodes
// V20 : ZS stockée dans les nodeData.contrainteGeom
//	public double factor_RayonSimplifNode;
	public boolean bSimplifNode;

	
// Fusion des nodes proches (depuis V22 20/12/2014)
	public boolean bFusionNodeDoublon;
	public String fusionNode_commonField;
	public double fusionNode_distMax;
	public Category fusionNode_catExcluded;
	public boolean  fusionNode_defusionFinTrt;
	
	// V18 Simplification Adaptative des Nodes limitée en fait à une simple réduction d'influence, sans modif des tailles des zones d'influence
	//public double seuilPourReductionDistSimplifNode = 0; ABANDONNE
	public double seuilPourReductionInfluenceNodeSimple; // = 0 pour désactiver la fonction

	// Simplification path
	public double factor_SimplifPath_tolerance;
	
	// Redécoupage des path
	public double factor_RedecoupPath_lgSegMax_std;
	public double factor_RedecoupPath_lgSegMax_procheNode;
	public double factor_RayonAction_decoupSeg_procheNode;
	public int nbMinPointEntre2Node;
	
	// Simplification topologie du réseau
	public double factor_SimplifTopo;

	// optimisation des dissymétries
	public boolean bOptimizeDissymetrie;

	// atténuation du mouvement dans les zones denses
	public double seuilAttenuationMouvement; // 0 -> desactive la fonction  1 -> la plus forte attenuation   en grandissant ce seuil, l'atténuation diminue

	// simplification avancée des nodes trop complexes "Trou noir"
	public boolean bSimplifTrouNoir;
	public int seuilComplexiteSimplifTrouNoir;
	public Category categorySimplifTrouNoir;

	// TRAITEMENT
	// poids des forces
	public double poidsForce_Repuls_from_PATH;
	public double poidsForce_Repuls_from_NODE;
	public double poidsForce_AttractPosition_PATH;
	public double poidsForce_AttractPosition_NODE;
	public double poidsForce_Entrainement_by_NODE;
	public double poidsForce_RespectForme_PATH;

	// parametre de l'algorithme : progression des echelles
	public double echelleInit;
	public double facteurIncrementEchelle;
	public int nbIterParEchelle;
	// post traitement (derniere serie d'itération qd on est arrivé à l'échelle finale)
	public int nbIterFinal;
	// Une augmentation de la force de respect de forme peut améliorer l'esthétique du traitement
	//  (ex a gauche de CURTI, la ligne 400 peut zigzager fort si pas cette option)
	public double poidsForce_RespectForme_PATH_final;

	// parametre avances
	public double pasTemps;
	public double facteurFrottement;

	
	// en  mode debug, demande de selection d'un sous ensemble de données
	public boolean extraitData_use;
	public String extraitData_fieldName;
	public String extraitData_fieldValue;
	public double extraitData_largeur;

	//**************************************************************************
	//**************************************************************************

	public double getLargestPath_papier_mm() {
		double res = 0;
		for (ContrainteGeomLine cgl : vContrainteGeomLine)
			if (!Double.isNaN(cgl.epaisseurTrait_papier_mm))
				res = Math.max(res, cgl.epaisseurTrait_papier_mm);
		return res;
	}


	// Pour toutes ces méthode de récup d'objets par leur nom,
	// vu les controles effectués par ParamsManager, on est obligé de trouver ...
	@Override
	public Category getCategoryByName(String name, TYPE_OBJECT typeObject) {
		switch(typeObject) {
			case NODE_LS: return getCategoryNodeByName(name);
			case PATH_LS: return getCategoryPathByName(name);
			default: assert false; return null;
		}
	}

	public Category getCategoryPathByName(String name) {
		if (name==null || name.length()==0)
			return Category.categoryNoData;

		for (Category cat : vCategoryLine) if (cat.name.equals(name)) return cat;

		assert(false); return null;
	}
	
	public Category getCategoryNodeByName(String name) {
		if (name==null || name.length()==0)
			return Category.categoryNoData;

		for (Category cat : vCategoryNode) if (cat.name.equals(name)) return cat;

		assert(false); return null;
	}


	public Zone getZoneByName(String name) {
		for (Zone zone : vZone) if (zone.name.equals(name)) return zone;
		assert(false); return null;
	}



}
